package com.fs.system.manager.controller;

import cn.hutool.core.io.FileUtil;
import com.fs.system.common.ResponseData;
import com.fs.system.exception.CustomerException;
import jakarta.servlet.ServletOutputStream;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;

@RestController
@RequestMapping("/files")
public class FileController {

    //设置文件上传根路径：当前项目的根路径+/files/
    private static final String filePath = System.getProperty("user.dir") + "/files/";

    @Value("${fileBaseUrl}")
    private String fileBaseUrl;

    /**
     * 文件上传
     * @param file
     * @return
     */
    @PostMapping("/upload")
    public ResponseData upload(MultipartFile file){  //文件流的形式接收前端传的文件
        String originalFilename = file.getOriginalFilename();  //文件上传时的原文件名
        if(!FileUtil.isDirectory(filePath)){
            FileUtil.mkdir(filePath);
        }

        //上传的文件名（时间戳+_+文件名）
        String fileName = System.currentTimeMillis() + "_" + originalFilename;
        //上传文件的完整路径
        String realFileName = filePath +  fileName;

        //写(写入实际文件上传的地址)
        try {
            FileUtil.writeBytes(file.getBytes(),realFileName);
        } catch (IOException e) {
            e.printStackTrace();
            throw new CustomerException( "500","文件上传失败");
        }
        //返回上传成功的网络链接文件地址
        String url = fileBaseUrl + "/files/download/" + fileName;

        return  new ResponseData( "200","上传成功",url);
    }

    /**
     *  文件下载
     * @param fileName
     * @param response
     */
    @GetMapping("/download/{fileName}")
    public void download(@PathVariable String fileName,HttpServletResponse response){
        try {
            // 设置下载文件http响应头
            // "Content-Disposition" 是一个 HTTP 响应头字段，用于指示如何处理响应内容
            // "attachment" 表示告诉浏览器将响应内容作为附件下载，而不是直接在浏览器中打开
            // fileName 是要下载的文件的名称，使用 URLEncoder.encode 方法将文件名进行 UTF-8 编码（这是为了避免文件名中包含特殊字符导致下载时出现乱码或其他问题）
            response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, StandardCharsets.UTF_8));
            // "application/octet-stream" 是一种通用的二进制数据类型
            // 当设置为这个类型时，浏览器会将响应内容视为二进制文件进行处理，适合用于下载各种类型的文件
            response.setContentType("application/octet-stream");
            ServletOutputStream os = response.getOutputStream();
            //完整图片下载路径示例：http://localhost:9090/files/download/1745421553399_QQ图片20240813213651.jpg
            String realFileName = filePath + fileName;
            byte[] bytes = FileUtil.readBytes(realFileName);
            os.write(bytes);
            os.flush();
            os.close();
        } catch (IOException e) {
            throw new CustomerException("500","文件下载失败");
        }
    }
}
